package threadTest;

/**
 * @Author: insight
 * @Version: sync_wait_notify_version_2
 * @Description: 01版本的优化 保证某个线程一定优先运行 这里以线程2优先运行打印字母为例子
 * @LastDate: 2020年9月27日上午11:04:36
 */
public class ThreadTest02_sync_wait_notify {
	//添加一个优先级标记
	public static volatile boolean t2Flag = false;
	
	public static void main(String[] args) {
		char[] a1 = "123456".toCharArray();
		char[] a2 = "ABCDEF".toCharArray();
		//定义一把对象锁
		final Object o = new Object();
		
		new Thread(()->{
			synchronized (o) {
				
				while (!t2Flag) {
					try {
						o.wait();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				
				for (var c : a1) {
					System.out.print(c);
					try {
						o.notify();
						o.wait();
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
				
				o.notify(); //最后必须唤醒 否则程序不会停止 因为打印结束之后 总有一个线程执行了wait 如果没有人去唤醒 程序就不会结束
			}
		}, "t1").start();
		
		new Thread(()->{
			synchronized (o) {				
				
				for (var c : a2) {
					System.out.print(c);
					t2Flag = true;
					try {
						o.notify();
						o.wait();
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
				
				o.notify();
			}
		}, "t2").start();
	}
}
